"""
自定义基础模型模块
提供全局序列化和验证逻辑
"""

from pydantic import BaseModel, field_serializer, ConfigDict
from datetime import datetime
from typing import Any, Optional
import json

class CustomBaseModel(BaseModel):
    """
    自定义 Pydantic 基类
    
    提供:
    - datetime 字段的 ISO8601 格式序列化
    - None 值的处理
    - JSON 序列化支持
    """
    
    # Pydantic v2 配置
    model_config = ConfigDict(
        json_encoders={
            datetime: lambda v: v.isoformat(),
        },
        # 允许从 ORM 模型创建
        from_attributes=True,
        # 验证赋值
        validate_assignment=True,
        # 额外字段检查
        extra='forbid'
    )

    @field_serializer('*', when_used='json', return_type=str)
    def serialize_datetime_fields(self, value: Any) -> str:
        """
        序列化字段为JSON兼容格式
        
        Args:
            value: 要序列化的值
            
        Returns:
            str: 序列化后的字符串
            
        特殊处理:
            - datetime 转换为 ISO8601 格式
            - None 转换为空字符串
            - 其他类型直接转换为字符串
        """
        if isinstance(value, datetime):
            return value.isoformat()
        if value is None:
            return ''
        return str(value)

    def json(self, **kwargs) -> str:
        """
        扩展的 JSON 序列化方法
        
        Args:
            **kwargs: 传递给 json.dumps 的参数
            
        Returns:
            str: JSON 字符串
        """
        return json.dumps(
            self.model_dump(),
            ensure_ascii=False,
            default=str,
            **kwargs
        )

    @classmethod
    def from_orm(cls, obj: Any) -> "CustomBaseModel":
        """
        从 ORM 模型创建 Pydantic 模型实例
        
        Args:
            obj: ORM 模型实例
            
        Returns:
            CustomBaseModel: Pydantic 模型实例
        """
        return cls.model_validate(obj) 